package services

import (
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
	"time"

	"github.com/google/uuid"
	"findata/models"
)

// ImageData 存储图片数据的结构
type ImageData struct {
	Name string `json:"name"`
	Data string `json:"data"` // base64编码的图片数据
	Type string `json:"type"`
}

// SavePostImages 保存帖子的图片
func SavePostImages(images []ImageData, postID uint) ([]models.PostImage, error) {
	// 创建上传目录（如果不存在）
	uploadDir := "static/uploads/forum"
	if err := os.MkdirAll(uploadDir, os.ModePerm); err != nil {
		return nil, fmt.Errorf("创建上传目录失败: %v", err)
	}

	var savedImages []models.PostImage

	for _, img := range images {
		// 从base64数据中提取实际的图片数据
		// 格式通常为: ...
		parts := strings.Split(img.Data, ",")
		if len(parts) != 2 {
			continue // 跳过格式不正确的数据
		}

		// 解码base64数据
		imgData, err := base64.StdEncoding.DecodeString(parts[1])
		if err != nil {
			continue // 跳过解码失败的数据
		}

		// 生成唯一文件名
		fileExt := getFileExtFromMimeType(img.Type)
		fileName := fmt.Sprintf("%s%s", uuid.New().String(), fileExt)
		filePath := filepath.Join(uploadDir, fileName)

		// 写入文件
		if err := ioutil.WriteFile(filePath, imgData, 0644); err != nil {
			continue // 跳过写入失败的文件
		}

		// 创建数据库记录
		postImage := models.PostImage{
			PostID:    postID,
			ImagePath: fmt.Sprintf("/static/uploads/forum/%s", fileName),
			CreatedAt: time.Now(),
		}

		// 保存到数据库
		if err := models.DB.Create(&postImage).Error; err != nil {
			// 如果保存失败，删除已写入的文件
			os.Remove(filePath)
			continue
		}

		savedImages = append(savedImages, postImage)
	}

	return savedImages, nil
}

// 根据MIME类型获取文件扩展名
func getFileExtFromMimeType(mimeType string) string {
	switch mimeType {
	case "image/jpeg":
		return ".jpg"
	case "image/png":
		return ".png"
	case "image/gif":
		return ".gif"
	case "image/webp":
		return ".webp"
	default:
		return ".jpg" // 默认扩展名
	}
}

// GetPostImages 获取帖子的所有图片
func GetPostImages(postID uint) ([]models.PostImage, error) {
	var images []models.PostImage
	if err := models.DB.Where("post_id = ?", postID).Find(&images).Error; err != nil {
		return nil, err
	}
	return images, nil
}

// DeletePostImages 删除帖子的所有图片
func DeletePostImages(postID uint) error {
	// 获取所有图片记录
	images, err := GetPostImages(postID)
	if err != nil {
		return err
	}

	// 删除文件和数据库记录
	for _, img := range images {
		// 删除文件
		filePath := filepath.Join("static", img.ImagePath)
		os.Remove(filePath) // 忽略错误，即使文件不存在也继续

		// 删除数据库记录
		models.DB.Delete(&img)
	}

	return nil
} 